﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __3E657D23_24B1_426e_B8EC_01624FB2F171__
#define __3E657D23_24B1_426e_B8EC_01624FB2F171__

#include "../tools/head.h"

/////////////////////////////////////////////////////////////////////////////////////////
// 

namespace xos
{


    class socket_impl : public xos_stl::mem_item< release_impl< socket_impl >, thread_lock >,
        public i_socket
    {
    public:
        typedef release_impl< socket_impl > T;

    public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //

        static int get_addr( POOL *** pppPool, LIST *** pppList );

    public:
        socket_impl();
        ~socket_impl();

    public:
        void * m_pUserData;
        sockaddr_in m_addr;
        int m_hSocket;

    protected:
        int init_data();

	public:
		int init();
		int term();

    public:
        // 
        // udp端口初始化
        // 
        int udp_init( const char * lpszLocalIp, unsigned short usLocalPort );

        // 
        // 返回值，为发送的字节数, -1表示失败
        // 
        int udp_send( const char * lpBuf, int nLen, const char * lpszToIp, unsigned short usToPort );

        // 
        // 返回值，为接收到的字节数, -1表示失败
        // 
        int udp_recv( char * lpBuf, int nLen, char * lpszFromIp, unsigned short * lpusFromPort );

        // 
        // tcp端口初始化
        // 
        int tcp_init( const char * lpszLocalIp, unsigned short usLocalPort, bool bBind );

        // 
        // accept
        // 
        int tcp_accept( i_socket ** ppv );

        // 
        // connect
        // 
        int tcp_connect( const char * lpszServerIp, unsigned short usServerPort );

        // 
        // tcp侦听
        // 
        int tcp_listen( int nNum );

        // 
        // 返回值，为发送的字节数, -1表示失败
        // 
        int tcp_send( const char * lpBuf, int nLen );

        // 
        // 返回值，为接收到的字节数, -1表示失败
        // 
        int tcp_recv( char * lpBuf, int nLen );

        // 
        // 设置异步/阻塞模式
        // 
        int set_async( bool bAsync );

        // 
        // 关闭端口
        // 
        int close( int onoff, int linger );

        // 
        // 停止后续发送
        // 
        int shut_down( int how );

        // 
        // 根据机器名得到IP
        // 
        int get_ip_by_name( const char * lpszName, unsigned long * lpdwIp, char * lpszIp );
        int get_ip_by_name( const char * lpszName, char * lpszIP );
        int get_local_addr( char * lpszName, char * lpszIP );

        // 
        // 根据socket句柄得到IP和端口
        // 
        int get_socket_addr( char * lpszIp, unsigned short * lpusPort );
        int get_peer_addr( char * lpszIp, unsigned short * lpusPort );

        // 
        // 返回设置进去的IP和端口
        // 
        int get_ip_port( char * lpszIp, unsigned short * lpusPort );
        void set_addr( void * lpAddr );

        // 
        // 取得socket句柄
        // 
        void set_socket( xos::xos_u64 ulSocket );
        xos_u64 get_socket();

        // 
        // get user data
        // 
        void * get_user_data( void ** ppvUserData );

        // 
        // set user data
        // 
        int set_user_data( void * pUserData );

    };
} // xos

#endif // __3E657D23_24B1_426e_B8EC_01624FB2F171__
